﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>线程 - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The 线程 function sets the priority or interruptibility of threads. It can also temporarily disable all timers." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>线程</h1>

<p>设置<a href="../misc/Threads.htm">线程</a>的优先级或是否可以被中断. 它也可以临时禁用所有的<a href="SetTimer.htm">计时器</a>.</p>
<pre class="Syntax"><span class="func">线程</span> <a href="#SubFunctions">SubFunction</a> <span class="optional">, Value1, Value2</span></pre>
<p><em>SubFunction</em>, <em>Value1</em> 和 <em>Value2</em> 参数互相依赖, 其用法描述如下.</p>

<h2 id="SubFunctions">子函数</h2>
<p>对于 <em>SubFunction</em>, 指定以下之一:</p>
<ul>
    <li><a href="#NoTimers">NoTimers</a>: 防止被任何的计时器中断.</li>
    <li><a href="#Priority">Priority</a>: 更改当前线程的优先级级别.</li>
    <li><a href="#Interrupt">Interrupt</a>: 更改新启动的线程的可中断时间.</li>
</ul>

<h3 id="NoTimers">NoTimers</h3>
<p>防止被任何计时器中断.</p>
<pre class="Syntax"><span class="func">线程</span> "NoTimers" <span class="optional">, TrueOrFalse</span></pre>
<p>此子函数防止线程被任何<a href="SetTimer.htm">计时器</a>中断, 直至<a href="../misc/Threads.htm">当前线程</a>结束, 或执行 <code>线程 "NoTimers", false</code>, 或被另一个允许计时器的线程中断(这样的情况下, 计时器可以中断正在中断的线程直到计时器完成).</p>
<p>如果<a href="../Scripts.htm#auto">自动执行线程</a>没有改变这个设置, 则所有线程均以可被计时器中断的方式启动(然而下面的 <a href="#Interrupt">Interrupt</a> 子函数设置仍会生效). 相比之下, 如果在自动执行线程中打开了这一设置, 但却从没有关闭它, 则每个新启动的<a href="../misc/Threads.htm">线程</a>(如 <a href="../Hotkeys.htm">热键</a>, <a href="../objects/Menu.htm">自定义菜单项</a>或<a href="SetTimer.htm">计时器</a>) 均以不会被计时器中断的方式启动.</p>
<p>不论默认的设置如何, 当脚本没有其他线程时计时器总能执行(除非使用了 <a href="Pause.htm">暂停</a>).</p>
<p><code>线程 "NoTimers"</code> 等同于 <code>线程 "NoTimers", true</code>. 此外, 由于 <em>TrueOrFalse</em> 是一个<a href="../Variables.htm#Expressions">表达式</a>, 因此 true 解析为 1, 而 false 解析为 0.</p>

<h3 id="Priority">Priority</h3>
<p>更改当前线程的优先级级别.</p>
<pre class="Syntax"><span class="func">线程</span> "Priority", Level</pre>
<p>指定 <em>Level</em> 为介于 -2147483648 和 2147483647 之间的整数(或<a href="../Variables.htm#Expressions">表达式</a>) 来表示当前线程的新优先级. 这不会影响其他线程. 有关详情, 请参阅<a href="../misc/Threads.htm">线程</a>.</p>
<p>由于具有缓冲事件的能力, 函数 <a href="Critical.htm">霸体</a> 通常优于这个子函数.</p>
<p>相关提示, 整个脚本的操作系统优先级可以通过 <a href="ProcessSetPriority.htm">设置进程优先级</a> 来改变. 例如:</p>
<pre>设置进程优先级 "High"</pre>

<h3 id="Interrupt">Interrupt</h3>
<p>更改新启动的线程的可中断时间.</p>
<pre class="Syntax"><span class="func">线程</span> "Interrupt" <span class="optional">, Duration, LineCount</span></pre>
<p class="note"><strong>注意:</strong> 应该谨慎使用此子函数, 因为大多数脚本在接近默认设置的情况下执行更一致..</p>
<p>默认情况下, 每个新启动的线程在开始的 <em>Duration</em>(15 毫秒) 或 <em>LineCount</em>(1000 行) 中都是不中断的, 以先到者为准. 这使线程有机会完成操作, 而不是被正在等待启动的另一个线程立即中断(如, 缓冲的<a href="../Hotkeys.htm">热键</a>或计划运行的<a href="SetTimer.htm">计时器子程序</a>).</p>
<p class="note"><strong>注意:</strong> 任何 <em>Duration</em> 小于 17 可能导致实际持续时间缩短或直接中断, 因为系统刻度计数的最小分辨率为 10 到 16 毫秒. 但是, 在线程中断之前, 将至少执行一行, 从而允许脚本在需要时启用 <a href="Critical.htm">霸体</a>.</p>
<p>如果任一参数为 0, 每个新启动的线程都可以被立即中断. 如果任一参数为 -1, 那么此参数会使得线程不会被中断. 这两个参数的最大值为 2147483647.</p>
<p>这个设置是全局的, 这意味着着它影响所有后续的线程, 即使此函数没有被<a href="../Scripts.htm#auto">自动执行线程</a>调用. 然而, <a href="../misc/Threads.htm">已经被中断过的线程</a>则不受影响, 因为它们不可中断的时间已经期满. 同样地, <a href="../misc/Threads.htm">当前线程</a>不受影响, 除非在更改 <em>LineCount</em> 参数时当前线程是不中断的, 在这种情况下, 新的 <em>LineCount</em> 将对其生效.</p>
<p>如果在<a href="../misc/Threads.htm">当前线程</a>处于不可中断状态时, 按下了<a href="../Hotkeys.htm">热键</a>或选择了<a href="../objects/Menu.htm">自定义菜单项</a>, 那么这些事件会被缓冲起来. 换句话说, 到当前线程结束或变得可中断时(无论先遇到哪个) 它们才会运行. 例外情况是当当前线程在结束前变得可中断并且它的<a href="#Priority">优先级</a>高于被缓冲的事件, 此时被缓冲的事件将被取消缓冲并被丢弃.</p>
<p>不论此子函数如何, 当一个线程在显示 <a href="MsgBox.htm">信息框</a>, <a href="InputBox.htm">输入框</a>, <a href="FileSelect.htm">文件选择框</a> 或 <a href="DirSelect.htm">目录选择框</a> 对话框时都将变成可中断的.</p>
<p>任一参数都可以留空来保持此设置不变.</p>

<h2 id="Remarks">备注</h2>
<p>由于更大的灵活性和缓冲事件的能力, 函数 <a href="Critical.htm">霸体</a> 通常比 <code>线程 "Interrupt"</code> 和 <code>线程 "Priority"</code> 更有效.</p>
<h2 id="Related">相关</h2>
<p><a href="Critical.htm">霸体</a>, <a href="../misc/Threads.htm">线程</a>, <a href="Hotkey.htm">热键</a>, <a href="../objects/Menu.htm">Menu 对象</a>, <a href="SetTimer.htm">设置定时器</a>, <a href="Process.htm">Process 函数</a></p>
<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a href="#ExBasic">#1</a></p>
<pre>线程 "Priority", 1 <em>; 使当前线程的优先级稍高于平均值.</em>
线程 "Interrupt", 0  <em>; 让每个新启动的线程立即变成可中断的:</em>
线程 "Interrupt", 50, 2000  <em>; 让每个线程在 50ms 或 2000 行(无论先遇到哪个) 之后变成可中断.</em></pre>
</div>

</body>
</html>